package math.leetcode_470;

public class RejectionStrategy {
    /*
    public int rand10() {
        int num = (rand7() - 1) * 7 + rand7();
        while (num > 10) {
            num = (rand7() - 1) * 7 + rand7();
        }
        return num;
    }
     */
    // 优化一：
    /*
    public int rand10() {
        int num = (rand7() - 1) * 7 + rand7();
        while (num > 40) {
            num = (rand7() - 1) * 7 + rand7();
        }
        return num % 10 + 1;
    }
     */
    public int rand10() {
        while (true) {
            // 在 [1...49] 范围上得到一个数
            int num = (rand7() - 1) * 7 + rand7();
            // 小于等于 40 直接返回
            if (num <= 40) {
                return num % 10 + 1;
            }
            // 执行到此处说说明刚才生成的数在 [41...49] 之间，转换成 rand9 继续计算
            // num - 40 的目的在让 num 处于 [1...9]，即转换成 rand9，此时生成的数在 [1 - 63] 之间
            num = (num - 40 - 1) * 7 + rand7();
            if (num <= 60) {
                return num % 10 + 1;
            }
            // 执行到此处说明刚才的数在 [61...63] 之间，转换成 rand3 继续计算
            num = (num - 60 - 1) * 7 + rand7();
            if (num <= 20) {
                return num % 10 + 1;
            }
        }
    }

    private int rand7() {
        return 0;
    }
}
